﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComHlp.ContentClasses;
using ComHlp.ContentClasses.VirtualControls.NetPlan;

namespace ComHlp.Classes.Parser.Supplementary
{
    internal class NetPlanParser
    {
        internal int ParseNetPlanData(StringBuilder sbRecvStr, MapGraphics mapGraphics, int elementLength)
        {
            //"1010101012015102920160224118003003 PR001105001000001000001VP 00002Z00 PF001036001089092089092VP 00003Z00   000582002117118117118KS 00000Z03X"
            mapGraphics.NetPlanData = new ItxNetPlan
            {
                No = ParseHelper.String2Int(sbRecvStr.ToString(0, 1)),
                YMax = ParseHelper.String2Int(sbRecvStr.ToString(1, 2)),
                YNo = ParseHelper.String2Int(sbRecvStr.ToString(3, 2)),
                XMax = ParseHelper.String2Int(sbRecvStr.ToString(5, 2)),
                XNo = ParseHelper.String2Int(sbRecvStr.ToString(7, 2)),
                AllStartDate = ParseHelper.String2Date(sbRecvStr.ToString(9, 8)),
                EndDate = ParseHelper.String2Date(sbRecvStr.ToString(17, 8)),
                DayCount = ParseHelper.String2Int(sbRecvStr.ToString(25, 3)),
                OrdersCount = ParseHelper.String2Int(sbRecvStr.ToString(28, 3)),
                IndexOfSelectedOrder = ParseHelper.String2Int(sbRecvStr.ToString(31, 3))
            };

            // clean string
            sbRecvStr.Remove(0, 34);
            elementLength -= 34;

            // now we need to get the associated orders
            //" -PR001105001-000-001-000-001-V-P- 00002Z00
            //" -PF001036001-089-092-089-092-V-P- 00003Z00
            //" -  000582002-117-118-117-118-K-S- 00000Z03X"
            for (int j = 0; j < mapGraphics.NetPlanData.OrdersCount; j++)
            {
                ItxNetPlanOrder netPlanOrder = new ItxNetPlanOrder
                {
                    Type = sbRecvStr.ToString(0, 1)
                };

                // prepare order 
                string order = sbRecvStr.ToString(1, 11);
                netPlanOrder.Order = $"{order.Substring(0, 2)} {order.Substring(2, 6).TrimStart('0')} {order.Substring(8, 3).TrimStart('0')}";

                netPlanOrder.PlannedStartDaysDiff = ParseHelper.String2Int(sbRecvStr.ToString(12, 3));
                netPlanOrder.PlannedEndDaysDiff = ParseHelper.String2Int(sbRecvStr.ToString(15, 3));
                netPlanOrder.CurrentStartDaysDiff = ParseHelper.String2Int(sbRecvStr.ToString(18, 3));
                netPlanOrder.CurrentEndDaysDiff = ParseHelper.String2Int(sbRecvStr.ToString(21, 3));
                switch (sbRecvStr.ToString(24, 1))
                {
                    case "V":
                        netPlanOrder.NetPlanOrderType = EItxNetPlanOrderType.Finishing;
                        break;
                    case "B":
                        netPlanOrder.NetPlanOrderType = EItxNetPlanOrderType.Order;
                        break;
                    case "K":
                        netPlanOrder.NetPlanOrderType = EItxNetPlanOrderType.CustomerOrder;
                        break;
                    case "L":
                        netPlanOrder.NetPlanOrderType = EItxNetPlanOrderType.Delivery;
                        break;
                }
                switch (sbRecvStr.ToString(25, 1))
                {
                    case "S":
                        netPlanOrder.NetPlanOrderState1 = EItxNetPlanOrderState1.Todo;
                        break;
                    case "I":
                        netPlanOrder.NetPlanOrderState1 = EItxNetPlanOrderState1.Finished;
                        break;
                    case "P":
                        netPlanOrder.NetPlanOrderState1 = EItxNetPlanOrderState1.Other;
                        break;
                }
                switch (sbRecvStr.ToString(26, 1))
                {
                    case "W":
                        netPlanOrder.NetPlanOrderState2 = EItxNetPlanOrderState2.LateAndInvalidDate;
                        break;
                    case "V":
                        netPlanOrder.NetPlanOrderState2 = EItxNetPlanOrderState2.Late;
                        break;
                    case "F":
                        netPlanOrder.NetPlanOrderState2 = EItxNetPlanOrderState2.NotScheduled;
                        break;
                    case "1":
                        netPlanOrder.NetPlanOrderState2 = EItxNetPlanOrderState2.InvalidDate;
                        break;
                    default: // == empty
                        netPlanOrder.NetPlanOrderState2 = EItxNetPlanOrderState2.Other;
                        break;
                }
                /* analyze the progress:
                        bei B=Bestellung Anteil bereits geliefert
                        bei K=Kundenauftr immer 00
                        leer = 100%*/
                string progress = sbRecvStr.ToString(27, 2);
                switch (progress)
                {
                    case "  ":
                        netPlanOrder.Progress = 100;
                        break;
                    case "B ":
                        netPlanOrder.Progress = 50;
                        break;
                    case "K ":
                        netPlanOrder.Progress = 0;
                        break;
                    default:
                        netPlanOrder.Progress = ParseHelper.String2Int(sbRecvStr.ToString(27, 2));
                        break;
                }

                netPlanOrder.IndexOfHeadOrder = ParseHelper.String2Int(sbRecvStr.ToString(29, 3));
                netPlanOrder.Addon = sbRecvStr.ToString(32, 1) == "Z";

                // parse the addons
                int addonLength = ParseHelper.String2Int(sbRecvStr.ToString(33, 2));
                for (int addonIndex = 0; addonIndex < addonLength;)
                {
                    ItxNetPlanAddon addon = new ItxNetPlanAddon();

                    string curVal = sbRecvStr.ToString(35 + addonIndex++, 1);
                    switch (curVal)
                    {
                        case "M":
                            addon.Type = EItxNetPlanAddonType.Client;
                            addon.Value = sbRecvStr.ToString(35 + addonIndex, 2);
                            addonIndex = addonIndex + 2;
                            break;
                        case "X":
                            addon.Type = EItxNetPlanAddonType.ReasonForBlocking;
                            addon.Value = sbRecvStr.ToString(35 + addonIndex, 2);
                            addonIndex = addonIndex + 2;
                            break;
                        case "J":
                        case "D":
                        case "F":
                            addon.Type = EItxNetPlanAddonType.Dummy;
                            addon.Value = curVal;
                            break;
                        default:
                            addon.Type = EItxNetPlanAddonType.Unknown;
                            addon.Value = curVal;
                            break;
                    }
                    // add to list
                    netPlanOrder.AddonList.Add(addon);
                }

                // final cut after addon length
                sbRecvStr.Remove(0, 35 + addonLength);
                elementLength -= 35 + addonLength;

                // add 
                mapGraphics.NetPlanData.Orders.Add(netPlanOrder);
            }

            return elementLength;
        }
    }
}
